From c6b2184aa0cce3b1ac65d538495cd725db0f4770 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 6 May 2019 11:57:32 +0100 Subject: [PATCH] Allow specifying the layout manager for a widget type Some widgets have a well-defined layout manager created alongside their own instance; if they do, we can handle the layout manager creation at the GtkWidget instantiation. --- gtk/gtkwidget.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ gtk/gtkwidget.h | 4 ++++ 2 files changed, 48 insertions(+) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index af0b48c8c6..f456f19306 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -497,6 +497,7 @@ struct _GtkWidgetClassPrivate GType accessible_type; AtkRole accessible_role; const char *css_name; + GType layout_manager_type; }; enum { @@ -706,6 +707,8 @@ static void gtk_widget_update_input_shape (GtkWidget *widget); static gboolean gtk_widget_class_get_visible_by_default (GtkWidgetClass *widget_class); +static GType gtk_widget_class_get_layout_manager_type (GtkWidgetClass *widget_class); + static void remove_parent_surface_transform_changed_listener (GtkWidget *widget); static void add_parent_surface_transform_changed_listener (GtkWidget *widget); @@ -2740,6 +2743,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) { GtkWidget *widget = GTK_WIDGET (instance); GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); + GType layout_manager_type; widget->priv = priv; @@ -2808,6 +2812,10 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) if (g_type_is_a (G_TYPE_FROM_CLASS (g_class), GTK_TYPE_ROOT)) priv->root = (GtkRoot *) widget; + + layout_manager_type = gtk_widget_class_get_layout_manager_type (g_class); + if (layout_manager_type != G_TYPE_INVALID) + gtk_widget_set_layout_manager (widget, g_object_new (layout_manager_type, NULL)); } /** @@ -13575,6 +13583,42 @@ gtk_widget_get_height (GtkWidget *widget) return priv->height; } +/** + * gtk_widget_class_set_layout_manager_type: + * @widget_class: class to set the layout manager type for + * @type: The object type that implements the #GtkLayoutManager for @widget_class + * + * Sets the type to be used for creating layout managers for widgets of + * @widget_class. The given @type must be a subtype of #GtkLayoutManager. + * + * This function should only be called from class init functions of widgets. + **/ +void +gtk_widget_class_set_layout_manager_type (GtkWidgetClass *widget_class, + GType type) +{ + GtkWidgetClassPrivate *priv; + + g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class)); + g_return_if_fail (g_type_is_a (type, GTK_TYPE_LAYOUT_MANAGER)); + + priv = widget_class->priv; + + priv->layout_manager_type = type; +} + +static GType +gtk_widget_class_get_layout_manager_type (GtkWidgetClass *widget_class) +{ + GtkWidgetClassPrivate *priv; + + g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), G_TYPE_INVALID); + + priv = widget_class->priv; + + return priv->layout_manager_type; +} + /** * gtk_widget_set_layout_manager: * @widget: a #GtkWidget diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 6961f20794..e93a40c743 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -414,6 +414,10 @@ void gtk_widget_set_layout_manager (GtkWidget *widge GDK_AVAILABLE_IN_ALL GtkLayoutManager * gtk_widget_get_layout_manager (GtkWidget *widget); +GDK_AVAILABLE_IN_ALL +void gtk_widget_class_set_layout_manager_type (GtkWidgetClass *widget_class, + GType type); + GDK_AVAILABLE_IN_ALL void gtk_widget_add_accelerator (GtkWidget *widget, const gchar *accel_signal, -- 2.30.2